package com.fow.core.platform.sms.ali;

/**
 * Created by suggestion on 2016/1/21.
 */

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class MsgSenderUtils {
    private static final Logger logger = LoggerFactory.getLogger(MsgSenderUtils.class);

    /**
     * 新的md5签名，首尾放secret。
     *
     * @param secret 分配给您的APP_SECRET
     */

    public static String md5Signature(TreeMap<String, Object> params, String secret) {

        String result = null;

        StringBuffer orgin = getBeforeSign(params, new StringBuffer(secret));

        if (orgin == null)

            return result;

        orgin.append(secret);

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");

            result = byte2hex(md.digest(orgin.toString().getBytes("utf-8")));

        } catch (Exception e) {

            throw new RuntimeException("sign error !");

        }

        return result;

    }

    /**
     * 二行制转字符串
     */

    private static String byte2hex(byte[] b) {

        StringBuffer hs = new StringBuffer();

        String stmp = "";

        for (int n = 0; n < b.length; n++) {

            stmp = (Integer.toHexString(b[n] & 0XFF));

            if (stmp.length() == 1)

                hs.append("0").append(stmp);

            else

                hs.append(stmp);

        }

        return hs.toString().toUpperCase();

    }

    /**
     * 添加参数的封装方法
     */

    private static StringBuffer getBeforeSign(TreeMap<String, Object> params, StringBuffer orgin) {

        if (params == null)

            return null;

        Map<String, Object> treeMap = new TreeMap<String, Object>();

        treeMap.putAll(params);

        Iterator<String> iter = treeMap.keySet().iterator();

        while (iter.hasNext()) {

            String name = (String) iter.next();

            orgin.append(name).append(params.get(name).toString());

        }

        return orgin;

    }

    /**
     * 连接到TOP服务器并获取数据
     */

    public static String getResult(String urlStr, String content) {

        logger.debug("aliMessage service connect start");

        URL url = null;

        HttpURLConnection connection = null;


        try {

            url = new URL(urlStr);

            connection = (HttpURLConnection) url.openConnection();

            connection.setDoOutput(true);

            connection.setDoInput(true);

            connection.setRequestMethod("POST");

            connection.setUseCaches(false);

            connection.connect();


            DataOutputStream out = new DataOutputStream(connection.getOutputStream());

            out.write(content.getBytes("utf-8"));

            out.flush();

            out.close();


            BufferedReader reader =

                    new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));

            StringBuffer buffer = new StringBuffer();

            String line = "";

            while ((line = reader.readLine()) != null) {

                buffer.append(line);

            }

            reader.close();

            String response = buffer.toString();

            logger.info("aliMessage response :" + response);

            return response;

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            if (connection != null) {

                connection.disconnect();

            }

        }

        return null;

    }
}
